/**
 *基本数据类型
 * boolean
 * number
 * string
 * number[]
 * Array<number>
 * t1: [string, number] 允许数组的不同下标指定不同的字符类型。
 * enum Color { Red,Green, Blue} 枚举
 *      enum Color {Red = 2, Green, Blue} 枚举类型都有下标默认0开始，可以强行指定下标，未指定下标默认自增。
 * any 表示编译时不检测类型是否合法
 *       let notSure: any = 4
 *      notSure = 'maybe a string'
 *      notSure = false // 也可以是个 boolean
 *      void 只能接收 undefined  和 null ,undefined 和  null是所有数据类型的子类，所以所有数字类型都可以赋值为undefined  和 null ,
 *      object  表示非原始类型，也就是除 number，string，boolean之外的类型，
 *
 */
// let 变量名称:数据类型 = '值';
let a: string = '你是憨憨';
// 声明一个 void 类型的变量没有什么大用，因为你只能为它赋予 undefined 和 null：
let unusable: void = undefined

//定义函数 function 函数名称(参数列表) 返回值类型{方法体}，参数列表中的参数如果没有指定类型默认any
function fn(): void {
}

// 变量名 obj 变量的参数类型  object  返回值类型 obj
function fn2(obj: object): object {
    console.log('fn2()', obj)
    return {}
    // return undefined
    // return null
}

// ------------------------------------------衍生------------------------------------------------------------------


//联合类型
//声明变量类型时可以同时声明多个。称为联合数据类型。
let b: string | number = `1`;
b = 1;
console.log(b);
// const 函数方法名 （参数列表） => 返回值 类型
const fu = (age:string|number)  =>  <object | string>{

}
export {
    a, fn
}



//类型断言 ，先判断类型是否正确，如果正确再执行后面的代码。
const  bb:string | number=1;
// 当 bb变量的；类型为 unknown 或者  string 时执行 .length。
(bb as unknown as string).length;



// 类型推断
// 有下面2种情况: 1. 定义变量时赋值了, 推断为对应的类型. 2. 定义变量时没有赋值, 推断为any类型.
//也就是说当定义类型后直接赋值,那么就不需要指定类型。
/* 定义变量时赋值了, 推断为对应的类型 */
let b9 = 123 // number
// b9 = 'abc' // error
/* 定义变量时没有赋值, 推断为any类型 */
let b10  // any类型
b10 = 123
b10 = 'abc'
